package cn.iocoder.yudao.module.hs.service.materialbox;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.hs.controller.admin.materialbox.vo.MaterialBoxPageReqVO;
import cn.iocoder.yudao.module.hs.controller.admin.materialbox.vo.MaterialBoxSaveReqVO;
import cn.iocoder.yudao.module.hs.dal.dataobject.materialbox.MaterialBoxDO;

import javax.validation.Valid;
import java.util.List;
import java.util.Set;

/**
 * 物料箱信息 Service 接口
 *
 * @author 航盛
 */
public interface MaterialBoxService {

    /**
     * 创建物料箱信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createMaterialBox(@Valid MaterialBoxSaveReqVO createReqVO);

    /**
     * 批量创建物料箱信息
     *
     * @param materialBoxList 创建信息
     * @return 编号
     */
    void createMaterialBoxes(List<MaterialBoxSaveReqVO> materialBoxList);

    /**
     * 更新物料箱信息
     *
     * @param updateReqVO 更新信息
     */
    void updateMaterialBox(@Valid MaterialBoxSaveReqVO updateReqVO);

    /**
     * 删除物料箱信息
     *
     * @param id 编号
     */
    void deleteMaterialBox(Long id);

    /**
     * 获得物料箱信息
     *
     * @param id 编号
     * @return 物料箱信息
     */
    MaterialBoxDO getMaterialBox(Long id);

    /**
     * 获得物料箱信息分页
     *
     * @param pageReqVO 分页查询
     * @return 物料箱信息分页
     */
    PageResult<MaterialBoxDO> getMaterialBoxPage(MaterialBoxPageReqVO pageReqVO);

    /**
     * 根据托盘编码更新物料箱入库信息
     *
     * @param trayCode 托盘编码
     */
    void updateMaterialBoxEntryByTrayCode(String trayCode, Long warehouseId, Long deptId);

    /**
     * 物料箱更换托盘
     *
     * @param materialBoxDOList
     * @param trayCode
     */
    void updateMaterialBoxTray(List<MaterialBoxDO> materialBoxDOList, String trayCode);

    /**
     * 获得物料箱信息
     *
     * @param boxCode 物料箱编码
     * @return 物料箱信息
     */
    MaterialBoxDO getMaterialBox(String boxCode);

    /**
     * 给指定的物料箱跟换RFID编码
     *
     * @param rfidCode
     * @param boxCode
     */
    void changeMaterialBox(String rfidCode, String boxCode);

    /**
     * 根据物料箱编码更新托盘编码
     *
     * @param trayCode 托盘编码
     * @param boxCode  物料箱编码
     */
    void updateTrayCodeByCode(String trayCode, String boxCode);

    /**
     * 根据物料箱编码更新托盘编码为空
     *
     * @param boxCode 物料箱编码
     */
    void updateNullTrayCodeByCode(String boxCode);

    /**
     * 三方仓更新物料箱信息，已出库
     *
     * @param boxCodes
     * @return
     */
    void updateMaterialBoxOut(Set<String> boxCodes, Long toWarehouseDeptId);

    /**
     * 三方仓更新物料箱信息，已出库
     *
     * @param boxCodes
     * @return
     */
    void updateMaterialBoxRollback(Set<String> boxCodes, Long warehouseId);

    /**
     *
     * @param boxCode
     * @param trayCode
     * @return
     */
    Boolean checkBoxInTray(String boxCode, String trayCode);
}
